const NodeCache = require('node-cache');

/**
 * 缓存管理器
 * 替代Java中的CaffeineCacheHolder
 */
class CacheHolder {
  constructor() {
    /**
     * key是appName，value是NodeCache实例
     */
    this.cacheMap = new Map();
    this.DEFAULT = 'default';
    
    // 默认缓存过期时间（分钟）
    this.defaultExpireMinutes = 1;
  }
  
  /**
   * 设置默认缓存过期时间
   * @param {number} minutes - 分钟数
   */
  setDefaultExpireMinutes(minutes) {
    this.defaultExpireMinutes = minutes;
  }
  
  /**
   * 获取指定应用的缓存
   * @param {string} appName - 应用名称
   * @returns {NodeCache} - 缓存实例
   */
  getCache(appName) {
    if (!appName || appName.trim() === '') {
      if (!this.cacheMap.has(this.DEFAULT)) {
        const cache = this._buildCache();
        this.cacheMap.set(this.DEFAULT, cache);
      }
      return this.cacheMap.get(this.DEFAULT);
    }
    
    if (!this.cacheMap.has(appName)) {
      const cache = this._buildCache();
      this.cacheMap.set(appName, cache);
    }
    return this.cacheMap.get(appName);
  }
  
  /**
   * 清空某个app的缓存
   * @param {string} appName - 应用名称
   */
  clearCacheByAppName(appName) {
    if (this.cacheMap.has(appName)) {
      this.cacheMap.get(appName).flushAll();
    }
  }
  
  /**
   * 获取每个app的缓存大小
   * @returns {Object} - 应用名和缓存大小的映射
   */
  getSize() {
    const sizeMap = {};
    for (const [appName, cache] of this.cacheMap.entries()) {
      const keys = cache.keys();
      sizeMap[appName] = keys.length;
    }
    return sizeMap;
  }
  
  /**
   * 构建缓存实例
   * @returns {NodeCache} - 缓存实例
   * @private
   */
  _buildCache() {
    // 使用NodeCache实现带过期时间的缓存
    return new NodeCache({
      stdTTL: this.defaultExpireMinutes * 60, // 默认过期时间（秒）
      checkperiod: 60, // 检查过期的时间间隔（秒）
      useClones: false // 不使用克隆，提高性能
    });
  }
  
  /**
   * 构建最近热键的缓存
   * @returns {NodeCache} - 热键缓存实例
   */
  buildRecentHotKeyCache() {
    return new NodeCache({
      stdTTL: 5, // 5秒过期
      checkperiod: 1, // 每秒检查过期
      useClones: false
    });
  }
}

// 导出单例
module.exports = new CacheHolder();
